package org.xxpay.core.common.util;

import org.apache.commons.lang3.StringUtils;
import org.xxpay.core.common.constant.RetEnum;
import org.xxpay.core.common.exception.ServiceException;

/**
 * google身份验证器 工具类
 */
public class GoogleAuthenticatorUtil {

    /** 验证谷歌验证码是否正确， 默认时间偏移量 5
     *  向外抛出异常， 请保证包含待校验谷歌验证码 和 秘钥
     * **/
    public static void checkByThrowException(Long googleCode, String googleAuthSecretKey){

        if (googleCode == null || googleCode <= 0) {
            throw new ServiceException(RetEnum.RET_MGR_GOOGLEAUTH_CODE_NULL);
        }

        if(StringUtils.isBlank(googleAuthSecretKey)) {
            throw new ServiceException(RetEnum.RET_MCH_GOOGLEAUTH_SECRETKEY_NOT_EXIST);
        }

        // 谷歌验证
        long t = System.currentTimeMillis();
        GoogleAuthenticator ga = new GoogleAuthenticator();
        ga.setWindowSize(5);    // 最多可偏移的时间
        boolean checkResult = ga.check_code(googleAuthSecretKey, googleCode, t);
        if (!checkResult) {
            throw new ServiceException(RetEnum.RET_MCH_GOOGLECODE_NOT_MATCH);
        }
    }

    /** 验证谷歌验证码是否正确， 默认时间偏移量 5
     *  向外抛出异常， 请保证包含待校验谷歌验证码 和 秘钥
     * **/
    public static boolean checkByThrowException2(Long googleCode, String googleAuthSecretKey){

        if (googleCode == null || googleCode <= 0) {
            throw new ServiceException(RetEnum.RET_MGR_GOOGLEAUTH_CODE_NULL);
        }

        if(StringUtils.isBlank(googleAuthSecretKey)) {
            throw new ServiceException(RetEnum.RET_MCH_GOOGLEAUTH_SECRETKEY_NOT_EXIST);
        }

        // 谷歌验证
        long t = System.currentTimeMillis();
        GoogleAuthenticator ga = new GoogleAuthenticator();
        ga.setWindowSize(5);    // 最多可偏移的时间
        boolean checkResult = ga.check_code(googleAuthSecretKey, googleCode, t);
        if (!checkResult) {
            return false;
        }
        return true;
    }

}
